package sv.gob.mh.dgii.dao.de.modulos.dinamico;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;
import org.hibernate.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import sv.gob.mh.dgii.dao.hibernate.HibernateDaoNoCrudImpl;
import sv.gob.mh.dgii.model.DeRucOpcion;
import sv.gob.mh.dgii.model.DeRucOpcionMsj;
import sv.gob.mh.dgii.model.DeRucPerOpcCam;
import sv.gob.mh.dgii.model.DeRucPerfil;
import sv.gob.mh.dgii.model.DeRucPerfilOpc;


@Repository
@Transactional
public class QueryDeRucPerfilDaoImp extends HibernateDaoNoCrudImpl implements QueryDeRucPerfil {

	/**
	 * Metodo de busqueda para consulta ruc con paginacion incluida
	 */
	@Override
	public DeRucPerfil obtenerPerfilPorModuloDinamico (String nombreModulo, String condicionPerfil){
            String jpql = "SELECT per FROM DeRucPerfil per inner join per.idModulo m where m.nombre = :nombre AND  per.condicion= :condicionPerfil AND per.bActivo = :estado";
            Query q = getSessionFactory().getCurrentSession().createQuery(jpql);
            q.setParameter("nombre", nombreModulo);
            q.setParameter("condicionPerfil", condicionPerfil);
            q.setParameter("estado", true); //Este activo el perfil
            return (DeRucPerfil) q.uniqueResult();
        }
        
        @Override
        public List<DeRucPerfilOpc> obtenerOpcionesPerfil (BigDecimal idPerfil){
            String jpql = "SELECT d FROM DeRucPerfilOpc d WHERE d.deRucPerfil.idPerfil = :idPerfil and d.bActivo = :estado ORDER BY d.nOrden asc";
            Query q = getSessionFactory().getCurrentSession().createQuery(jpql);
            q.setParameter("idPerfil", idPerfil);
            q.setParameter("estado", true); //Este activo el perfil
            return q.list();
        }
        
        @Override
        public List<DeRucOpcion> obtenerOpcionesDependientes (BigDecimal idOpcionPrincipal){
            String jpql = "SELECT d FROM DeRucOpcion d WHERE d.idOpcionPrincipal.idOpcion= :idOpcion and d.bActivo = :estado";
            Query q = getSessionFactory().getCurrentSession().createQuery(jpql);
            q.setParameter("idPerfil", idOpcionPrincipal);
            q.setParameter("estado", true); //Este activo el perfil
            return q.list();
        }
        
        @Override
        public List<DeRucOpcionMsj> obtenerMensajesPorPerfilOpcion(DeRucPerfilOpc perfilOpcion){
            String jpql = "SELECT d FROM DeRucOpcionMsj d WHERE d.deRucPerfilOpc = :perfilOpcion and d.bActivo = :estado";
            Query q = getSessionFactory().getCurrentSession().createQuery(jpql);
            q.setParameter("perfilOpcion", perfilOpcion);
            q.setParameter("estado", true); //Este activo los mensajes
            return q.list();
        }

    @Override
    public List<DeRucPerOpcCam> obtenerCamposPorPerfil(Integer idPerfilContribuyente, Integer idOpcion) {
        String jpql = "SELECT d FROM DeRucPerOpcCam d JOIN FETCH d.deRucCampo ca JOIN FETCH ca.idTipoDato JOIN FETCH ca.idTipoCampo LEFT JOIN FETCH d.deRucCampoMsjList msj LEFT JOIN FETCH msj.idTipoMensaje "
                + "WHERE d.deRucPerOpcCamPK.idPerfil = :perfil and d.deRucPerOpcCamPK.idOpcion = :opcion and d.bActivo = :estado ORDER BY d.nOrden";
            Query q = getSessionFactory().getCurrentSession().createQuery(jpql);
            q.setParameter("perfil", new BigInteger(idPerfilContribuyente.toString()));
            q.setParameter("opcion", new BigInteger(idOpcion.toString()));
            q.setParameter("estado", true); //Este activo los mensajes
            return q.list();
    }
}
